home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / mmdf / mmdf-IIb.43 / src / ean / qu2en_send.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-02-28  |  6.3 KB  |  312 lines

  1. /*
  2.  *  Copyright University College London - 1984
  3.  *
  4.  *  Channel to submit EAN Mail
  5.  *
  6.  *  Steve Kille - November 1984
  7.  */
  8. #include "util.h"
  9. #include "mmdf.h"
  10. #include "phs.h"
  11. #include "ap.h"
  12. #include "ch.h"
  13. #include <pwd.h>
  14. #include <sys/stat.h>
  15. #include "adr_queue.h"
  16.  
  17. extern Chan     *chanptr;
  18. extern LLog     *logptr;
  19.  
  20. extern int      errno;
  21. extern int      ap_outtype;
  22.  
  23. extern char *strcpy ();
  24. extern char *index();
  25. extern char *rindex();
  26. extern char *ap_p2s();
  27.  
  28. LOCVAR char en_info[LINESIZE];
  29. LOCVAR char en_sender[LINESIZE];
  30. LOCVAR char en_adr[LINESIZE];
  31.  
  32. LOCVAR int gotone;
  33.  
  34. LOCVAR struct rp_construct
  35.     rp_adr  =
  36. {
  37.     RP_AOK, 'a', 'd', 'd', 'r', 'e', 's', 's', ' ', 'o', 'k', '\0'
  38. },
  39.     rp_gdtxt =
  40. {
  41.     RP_MOK, 't', 'e', 'x', 't', ' ', 's', 'e', 'n', 't', ' ', 'o', 'k', '\0'
  42. },
  43.     rp_lio =
  44. {
  45.     RP_LIO, 'l', 'o', 'c', 'a', 'l', ' ', 'g', 'l', 'i', 't', 'c', 'h', '\0'
  46. }          ,
  47.     rp_bdtxt =
  48. {
  49.    RP_NDEL, 't', 'e', 'x', 't', ' ', 'c', 'o', 'p', 'y', ' ', 'f', 'a', 'i',
  50.     'l', 'u', 'r', 'e', ' ', 't', 'o', ' ', 'E', 'A', 'N', '\0'
  51. },
  52. rp_hend  =
  53. {
  54.     RP_NOOP, 'e', 'n', 'd', ' ', 'o', 'f', ' ', 'h', 'o', 's', 't', ' ',
  55.     'i', 'g', 'n', 'o', 'r', 'e', 'd', '\0'
  56. };
  57.  
  58. /* */
  59.  
  60. qu2en_send ()                       /* overall mngmt for batch of msgs    */
  61. {
  62.     short     result;
  63.     AP_ptr ap;
  64.     AP_ptr local,
  65.         domain,
  66.         route;
  67.     char *sender;
  68.     char *mydomain;
  69.  
  70. #ifdef DEBUG
  71.     ll_log (logptr, LLOGBTR, "qu2en_send ()");
  72. #endif
  73.  
  74.     if (rp_isbad (result = qu_pkinit ()))
  75.         return (result);
  76.  
  77.     /* While there are messages to process... */
  78.     for(;;){
  79.         result = qu_rinit (en_info, en_sender, chanptr -> ch_apout);
  80.         if(rp_gval(result) == RP_NS){
  81.             /* qu_rend(); */
  82.             continue;
  83.         }
  84.         if(rp_gval(result) != RP_OK)
  85.             break;
  86.         ap_outtype = AP_733;
  87.         ap = ap_s2tree (en_sender);
  88.         if (ap != (AP_ptr) NOTOK)
  89.         {
  90.             ap_t2parts (ap, (AP_ptr *) 0, (AP_ptr *) 0,
  91.                 &local, &domain, &route);
  92.             sender = ap_p2s ((AP_ptr) 0, (AP_ptr) 0,
  93.                 local, domain, route);
  94.             if(sender == (char *)MAYBE)
  95.                 return (RP_NS);
  96.             ap_sqdelete (ap);
  97.             ap_free (ap);
  98.         }
  99.         else
  100.         {
  101.             ll_log (logptr,  "Duff sender '%s'", en_sender);
  102.             return (RP_NO);
  103.         }
  104.  
  105.         ll_log (logptr, LLOGFST, "Message from '%s'", sender);
  106.  
  107.         if ((mydomain = rindex (sender, '.')) == (char *) 0)
  108.         {
  109.             ll_log (logptr, LLOGTMP, "Sender with no dots '%s'");
  110.             return (RP_NO);
  111.         }
  112.         mydomain++;
  113.  
  114.         if (en_init (sender, mydomain) != OK)
  115.         {
  116.             ll_log (logptr, LLOGTMP, "Failed to initialise EAN");
  117.             return (RP_LIO);
  118.         }
  119.         free (sender);
  120.  
  121.         phs_note (chanptr, PHS_WRSTRT);
  122.  
  123.         if (rp_isbad (result = qu2en_each ()))
  124.             return (result);
  125.     }
  126.  
  127.     if (en_end() != OK)
  128.     {               /* Make sure all is still happy */
  129.         ll_log (logptr, LLOGTMP, "Bad  EAN termination");
  130.         return (RP_RPLY);
  131.     }
  132.  
  133.     if (rp_gval (result) != RP_DONE)
  134.     {
  135.         ll_log (logptr, LLOGTMP, "not DONE (%s)", rp_valstr (result));
  136.         return (RP_RPLY);         /* catch protocol errors            */
  137.     }
  138.  
  139.     qu_pkend ();                  /* done getting messages              */
  140.     phs_note (chanptr, PHS_WREND);
  141.  
  142.     return (result);
  143. }
  144. /* */
  145.  
  146. LOCFUN
  147. qu2en_each ()               /* send addresses and then text */
  148. {
  149.     RP_Buf  replyval;
  150.     short   result;
  151.     char    host[LINESIZE];
  152.     AP_ptr ap;
  153.     AP_ptr local,
  154.         domain,
  155.         route;
  156.     char    *adr;
  157.  
  158. #ifdef DEBUG
  159.     ll_log (logptr, LLOGBTR, "qu2en_each()");
  160. #endif
  161.     ap_outtype = AP_733;
  162.     gotone = FALSE;
  163.  
  164.     /* while there are addessses to process... */
  165.     FOREVER
  166.     {
  167.         result = qu_radr (host, en_adr);
  168.         if (rp_isbad (result))
  169.             return (result);      /* get address from Deliver */
  170.  
  171.         if (rp_gval (result) == RP_HOK)
  172.         {                       /* no-op the sub-list indication */
  173.             qu_wrply ((RP_Buf *) &rp_hend, rp_conlen (rp_hend));
  174.             continue;
  175.         }
  176.  
  177.         if (rp_gval (result) == RP_DONE)
  178.         {
  179.  
  180.             if (!gotone)
  181.             {
  182.             ll_log (logptr, LLOGFST, "NO valid addrs so no text");
  183.             qu_wrply ((RP_Buf *) &rp_gdtxt, rp_conlen (rp_gdtxt));
  184.             return (RP_OK);
  185.             }
  186.  
  187.             if (rp_isgood (result = qu2en_txtcpy()))
  188.             qu_wrply ((RP_Buf *) &rp_gdtxt, rp_conlen (rp_gdtxt));
  189.             else
  190.             {
  191.             if (result == RP_LIO)
  192.                 qu_wrply ((RP_Buf *) &rp_lio,
  193.                     rp_conlen (rp_lio));
  194.             else
  195.                 qu_wrply ((RP_Buf *) &rp_bdtxt,
  196.                     rp_conlen (rp_bdtxt));
  197.             }
  198.             return (RP_OK);       /* end of message  */
  199.         }
  200.  
  201.         ap = ap_s2tree (en_adr);
  202.         if (ap != (AP_ptr) NOTOK)
  203.         {
  204.             ap_t2parts (ap, (AP_ptr *) 0, (AP_ptr *) 0,
  205.                 &local, &domain, &route);
  206.             if (route != (AP_ptr) 0)
  207.                 route = route -> ap_chain;
  208.             adr = ap_p2s ((AP_ptr) 0, (AP_ptr) 0,
  209.                 local, domain, route);
  210.             if(adr == (char *)MAYBE)
  211.                 return (RP_NS);
  212. #ifdef DEBUG
  213.             ll_log (logptr, LLOGFST, "Fixed adr to '%s'",
  214.                 adr);
  215. #endif
  216.             ap_sqdelete (ap);
  217.             ap_free (ap);
  218.         }
  219.         else
  220.         {
  221.             ll_log (logptr, LLOGTMP, "Bad format adr '%s'",
  222.                     en_adr);
  223.             return (RP_NDEL);
  224.         }
  225.  
  226.         if (en_wadr (adr,  replyval.rp_line) == OK)
  227.         {
  228.             gotone = TRUE;
  229.             qu_wrply ((RP_Buf *) &rp_adr, rp_conlen (rp_adr));
  230.         }
  231.         else
  232.         {
  233.             replyval.rp_val = RP_USER;
  234.             ll_log (logptr, LLOGFST, "EAN failed on addr '%s'",
  235.                 en_adr);
  236.             qu_wrply (&replyval, (sizeof replyval.rp_val));
  237.         }
  238.         free (adr);
  239.     }
  240. }
  241.  
  242. /* */
  243. char template[] = "/tmp/enn.XXXXXX";
  244.  
  245.  
  246. LOCFUN
  247. qu2en_txtcpy ()                 /* copy the text of the message       */
  248. {
  249.     register int offset;
  250.     int     len;
  251.     int     result;
  252.     char    buffer[BUFSIZ];
  253.     int     fd;
  254.     FILE    *fp;
  255.  
  256. #ifdef DEBUG
  257.     ll_log (logptr, LLOGBTR, "qu2en_txtcpy()");
  258. #endif
  259.  
  260.  
  261.  
  262.     mktemp (template);
  263.     if ((fd = creat (template, 0666)) < 0)
  264.     {
  265.         ll_log (logptr, LLOGTMP, "Failed to create temp file %s",
  266.             template);
  267.         return (RP_LIO);
  268.     }
  269.  
  270.     qu_rtinit (0L);
  271.     len = sizeof(buffer);
  272.     while (rp_gval (result = qu_rtxt (buffer, &len)) == RP_OK)
  273.     {
  274.         if (write (fd, buffer, len) != len)
  275.         {
  276.             ll_err (logptr, LLOGTMP, "error writing out text");
  277.             return (RP_LIO);
  278.         }
  279.         len = sizeof(buffer);
  280.     }
  281.  
  282.     if (rp_gval (result) != RP_DONE)
  283.         return (RP_LIO);         /* didn't get it all across? */
  284.  
  285.     if (close (fd) != OK)
  286.     {
  287.         ll_log (logptr, LLOGTMP, "Failed to close file '%s'",
  288.             template);
  289.         return (RP_LIO);
  290.     }
  291.  
  292.     if ((fp = fopen (template, "r")) == NULL)
  293.     {
  294.         ll_log (logptr, LLOGTMP, "Failed to reopne '%s'",
  295.             template);
  296.         return (RP_LIO);
  297.     }
  298.  
  299.     if ((result = en_txt (fp)) != OK)
  300.     {
  301.         ll_log (logptr, LLOGTMP, "EAN copy of file '%s' failed",
  302.             template);
  303.         fclose (fp);
  304.         return (RP_NO);
  305.     }
  306.  
  307.     fclose (fp);
  308.     unlink (template);
  309.  
  310.     return (RP_MOK);              /* got the text out                   */
  311. }
  312.